超難物だったaimemonのバグがやっと取れました。
これで安定してくれると嬉しいなぁ……。
以下、修正点を説明します。
フォアグラウンド ウィンドウが存在しない時は枠無しと判定させる §
実は大きく誤解していました。
どのような状況でも、フォアグラウンド ウィンドウは存在するのが基本であって、それが存在しないのはフォアグラウンド ウィンドウが切り替わる間の短い一瞬でしかないと思っていました。そのため、フォアグラウンド ウィンドウが見つからないときは、それが見つかるまで待つように組んでいました。
しかし、実際にはリモートデスクトップ接続を切った後等に、長時間、フォアグラウンド ウィンドウが存在しない状況が発生することが分かりました。このような状況で、Sleep APIの呼び出しを挟みつつフォアグラウンド ウィンドウが見つかるまで待つコードが実行されていると、メッセージに応答しないウィンドウになってしまいます。どうやら、このような状態が発生すると、WS_EX_NOACTIVATEが指定されたウィンドウであっても、タスクバーに名前が出てしまうことがあるようです。
そこで、フォアグラウンド ウィンドウが見つからない場合は、対象のウィンドウはない……と判定するように直しました。(正確には、サイズ0のウィンドウと処理している)
フォアグラウインドウィンドウが1つしか存在しないとき、フォーカスを持っていて枠付きのコントロールを含むウィンドウを不可視にすると、色が変化しない枠が残る問題を解消 §
これは、典型的な非同期プログラミングのミスでした。
対象となるウィンドウが変化したか否かの判定と、変化後のウィンドウを処理する際のサイズの取得を別々に行っていた結果、判定時と処理時で得たウィンドウサイズが違う……という現象が起こっていました。
ゼロから書き起こしていればたぶん発生していない状況です。
試行錯誤してソースを組んでいた関係で、意図せずして発生してしまった状況だろうと思います。